home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / sox / reverse.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  138 lines

  1.  
  2. /*
  3.  * June 1, 1992
  4.  * Copyright 1992 Guido van Rossum And Sundry Contributors
  5.  * This source code is freely redistributable and may be used for
  6.  * any purpose.  This copyright notice must be maintained. 
  7.  * Guido van Rossum And Sundry Contributors are not responsible for 
  8.  * the consequences of using this software.
  9.  */
  10.  
  11. /*
  12.  * "reverse" effect, uses a temporary file created by tmpfile().
  13.  */
  14.  
  15. #include <math.h>
  16. #include "st.h"
  17.  
  18. IMPORT FILE *tmpfile();
  19.  
  20. #ifndef SEEK_SET
  21. #define SEEK_SET        0
  22. #endif
  23. #ifndef SEEK_CUR
  24. #define SEEK_CUR        1
  25. #endif
  26. #ifndef SEEK_END
  27. #define SEEK_END        2
  28. #endif
  29.  
  30. /* Private data */
  31. typedef struct reversestuff {
  32.     FILE *fp;
  33.     long pos;
  34.     int phase;
  35. } *reverse_t;
  36.  
  37. #define WRITING 0
  38. #define READING 1
  39.  
  40. /*
  41.  * Process options: none in our case.
  42.  */
  43.  
  44. reverse_getopts(effp, n, argv) 
  45. eff_t effp;
  46. int n;
  47. char **argv;
  48. {
  49.     if (n)
  50.         fail("Reverse effect takes no options.");
  51. }
  52.  
  53. /*
  54.  * Prepare processing: open temporary file.
  55.  */
  56.  
  57. reverse_start(effp)
  58. eff_t effp;
  59. {
  60.     reverse_t reverse = (reverse_t) effp->priv;
  61.     reverse->fp = tmpfile();
  62.     if (reverse->fp == NULL)
  63.         fail("Reverse effect can't create temporary file\n");
  64.     reverse->phase = WRITING;
  65. }
  66.  
  67. /*
  68.  * Effect flow: a degenerate case: write input samples on temporary file,
  69.  * don't generate any output samples.
  70.  */
  71.  
  72. reverse_flow(effp, ibuf, obuf, isamp, osamp)
  73. eff_t effp;
  74. long *ibuf, *obuf;
  75. int *isamp, *osamp;
  76. {
  77.     reverse_t reverse = (reverse_t) effp->priv;
  78.  
  79.     if (reverse->phase != WRITING)
  80.         fail("Internal error: reverse_flow called in wrong phase");
  81.     if (fwrite((char *)ibuf, sizeof(long), *isamp, reverse->fp)
  82.         != *isamp)
  83.         fail("Reverse effect write error on temporary file\n");
  84.     *osamp = 0;
  85. }
  86.  
  87. /*
  88.  * Effect drain: generate the actual samples in reverse order.
  89.  */
  90.  
  91. reverse_drain(effp, obuf, osamp)
  92. eff_t effp;
  93. long *obuf;
  94. int *osamp;
  95. {
  96.     reverse_t reverse = (reverse_t) effp->priv;
  97.     int len, nbytes;
  98.     register int i, j;
  99.     register long temp;
  100.  
  101.     if (reverse->phase == WRITING) {
  102.         fflush(reverse->fp);
  103.         fseek(reverse->fp, 0L, SEEK_END);
  104.         reverse->pos = ftell(reverse->fp);
  105.         if (reverse->pos % sizeof(long) != 0)
  106.             fail("Reverse effect finds odd temporary file\n");
  107.         reverse->phase = READING;
  108.     }
  109.     len = *osamp;
  110.     nbytes = len * sizeof(long);
  111.     if (reverse->pos < nbytes) {
  112.         nbytes = reverse->pos;
  113.         len = nbytes / sizeof(long);
  114.     }
  115.     reverse->pos -= nbytes;
  116.     fseek(reverse->fp, reverse->pos, SEEK_SET);
  117.     if (fread((char *)obuf, sizeof(long), len, reverse->fp) != len)
  118.         fail("Reverse effect read error from temporary file\n");
  119.     for (i = 0, j = len-1; i < j; i++, j--) {
  120.         temp = obuf[i];
  121.         obuf[i] = obuf[j];
  122.         obuf[j] = temp;
  123.     }
  124.     *osamp = len;
  125. }
  126.  
  127. /*
  128.  * Close and unlink the temporary file.
  129.  */
  130. reverse_stop(effp)
  131. eff_t effp;
  132. {
  133.     reverse_t reverse = (reverse_t) effp->priv;
  134.  
  135.     fclose(reverse->fp);
  136. }
  137.  
  138.